package simulaco.web.action;

import gminet.infra.business.BusinessException;
import gminet.infra.db.TransactionException;
import gminet.infra.web.WebException;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import simulaco.business.ConcursoNivelBusiness;
import simulaco.business.InstituicaoBusiness;
import simulaco.business.MateriaBusiness;
import simulaco.business.OrgaoBusiness;
import simulaco.business.SimuladoModeloBusiness;
import simulaco.business.SimuladoUsuarioBusiness;
import simulaco.dto.Acao;
import simulaco.dto.ConcursoNivel;
import simulaco.dto.Instituicao;
import simulaco.dto.Materia;
import simulaco.dto.Orgao;
import simulaco.dto.SimuladoModelo;
import simulaco.dto.SimuladoModeloMateria;
import simulaco.dto.SimuladoUsuario;

@ManagedBean(name = "simuladoUsuarioAction")
@SessionScoped
public class SimuladoUsuarioAction extends WebAction {

    private static final long serialVersionUID = 8447963397798966816L;

    private SimuladoUsuario simuladoUsuario;

    private SimuladoModelo simuladoModelo;

    private List<SimuladoUsuario> simuladosUsuario;

    private List<SimuladoModelo> simuladosModelo;

    private int codigoMateria;

    private SimuladoModeloMateria simuladoMateria;

    public SimuladoUsuarioAction() {

        super();
    }

    public String listar() throws WebException {

        verificarLogin();
        String pageReturn = "";
        try {
            setSimuladosUsuario(SimuladoUsuarioBusiness.findAll());
            pageReturn = "listaSimuladoUsuario";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public void executarAcao() throws WebException {

        verificarLogin();
        if (getAcao().equals(Acao.EXCLUIR)) {
            excluir();
        }
    }

    private void excluir() throws WebException {

        verificarLogin();
        try {
            SimuladoUsuarioBusiness.delete(getSimuladoUsuario());
            // ATUALIZA LISTA
            setSimuladosUsuario(SimuladoUsuarioBusiness.findAll());
            // GRAVA MENSAGEM PARA O USUARIO
            addMessage("frmListaSimulados", "Simulado excluido com sucesso!");
        } catch (BusinessException be) {
            addBusinessException("frmListaSimulados", be);
        } catch (TransactionException te) {
            throw new WebException(te);
        }
    }

//    public String listarSimuladosModelo() throws WebException {
//
//        verificarLogin();
//        String pageReturn = "";
//        try {
//            setSimuladosModelo(SimuladoModeloBusiness.findAll());
//            pageReturn = "listaSimuladoModelo";
//        } catch (TransactionException te) {
//            throw new WebException(te);
//        }
//        return pageReturn;
//    }

    public String prepararInclusaoFromModelo() throws WebException {

        verificarLogin();
        setAcaoIncluir(true);
        String pageReturn = "";
        try {
            setSimuladosModelo(SimuladoModeloBusiness.findActives());
            pageReturn = "listaSimuladoModelo";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String prepararInclusao() throws WebException {

        verificarLogin();
        setAcaoIncluir(true);
        this.simuladoUsuario = null;
        if (getSimuladoModelo().getCodigo() > 0) {
            try {
                setSimuladoModelo(SimuladoModeloBusiness.findByPK(getSimuladoModelo().getCodigo()));
            } catch (TransactionException te) {
                throw new WebException(te);
            }
        } else {
            this.simuladoModelo = null;
        }
        return "mantemSimuladoUsuarioFromLista";
    }

    public String incluir() throws WebException {

        verificarLogin();
        String pageReturn = "";
        try {
            getSimuladoUsuario().setUsuario(getUsuarioLocal());
            SimuladoUsuarioBusiness.insert(getSimuladoUsuario(), getSimuladoModelo());
            pageReturn = listar();
        } catch (BusinessException be) {
            addBusinessException("frmSimuladoUsuario", be);
            pageReturn = "mantemSimuladoUsuario";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String prepararAlteracao() throws WebException {

        verificarLogin();
        setAcaoAlterar(true);
        String pageReturn = "";
        try {
            this.simuladoUsuario = SimuladoUsuarioBusiness.findByPK(getSimuladoUsuario().getCodigo());
            if (this.simuladoUsuario == null) {
                throw new WebException("Simulado não encontrado.");
            }
            //
            pageReturn = "mantemSimuladoUsuarioFromLista";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String alterar() throws WebException {

        verificarLogin();
        String pageReturn = "";
        try {
            SimuladoUsuarioBusiness.update(getSimuladoUsuario());
            pageReturn = listar();
        } catch (BusinessException be) {
            addBusinessException("frmSimuladoModelo", be);
            pageReturn = "adminMantemSimuladoModelo";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public void adicionarMateria() throws WebException {

        verificarLogin();
        getSimuladoModelo().getListaSimuladoMaterias().add(new SimuladoModeloMateria(++this.codigoMateria));
    }

    public void excluirMateria() throws WebException {

        verificarLogin();
        getSimuladoModelo().getListaSimuladoMaterias().remove(getSimuladoMateria());
    }

    public List<SelectItem> getInstituicaoItems() throws WebException {

        List<SelectItem> instituicaoItems = new ArrayList<SelectItem>();
        List<Instituicao> listaInstituicao;
        try {
            listaInstituicao = InstituicaoBusiness.findActives();
            for (Instituicao instituicao : listaInstituicao) {
                instituicaoItems.add(new SelectItem(new Integer(instituicao.getCodigo()), instituicao.getNome()));
            }
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return instituicaoItems;
    }

    public List<SelectItem> getOrgaoItems() throws WebException {

        List<SelectItem> orgaoItems = new ArrayList<SelectItem>();
        List<Orgao> listaOrgao;
        try {
            listaOrgao = OrgaoBusiness.findActives();
            for (Orgao orgao : listaOrgao) {
                orgaoItems.add(new SelectItem(new Integer(orgao.getCodigo()), orgao.getNome()));
            }
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return orgaoItems;
    }

    public List<SelectItem> getNivelItems() throws WebException {

        List<SelectItem> nivelItems = new ArrayList<SelectItem>();
        List<ConcursoNivel> listaNivel = ConcursoNivelBusiness.findAll();
        for (ConcursoNivel nivel : listaNivel) {
            nivelItems.add(new SelectItem(new Integer(nivel.getCodigo()), nivel.getNome()));
        }
        return nivelItems;
    }

//    public List<SelectItem> getSituacaoItems() throws WebException {
//
//        List<SelectItem> situacaoItems = new ArrayList<SelectItem>();
//        List<Situacao> listaSituacao = SituacaoBusiness.findAll();
//        for (Situacao situacao : listaSituacao) {
//            situacaoItems.add(new SelectItem(new Integer(situacao.getCodigo()), situacao.getNome()));
//        }
//        return situacaoItems;
//    }

    public List<SelectItem> getMateriaItems() throws WebException {

        List<SelectItem> materiaItems = new ArrayList<SelectItem>();
        List<Materia> listaMaterias;
        try {
            listaMaterias = MateriaBusiness.findActives();
            for (Materia materia : listaMaterias) {
                materiaItems.add(new SelectItem(new Integer(materia.getCodigo()), materia.getNome()));
            }
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return materiaItems;
    }

    public SimuladoUsuario getSimuladoUsuario() {
        if (this.simuladoUsuario == null) {
            this.simuladoUsuario = new SimuladoUsuario();
        }
        return this.simuladoUsuario;
    }

    public void setSimuladoUsuario(SimuladoUsuario simuladoUsuario) {
        this.simuladoUsuario = simuladoUsuario;
    }
    
    public List<SimuladoUsuario> getSimuladosUsuario() {
        if (this.simuladosUsuario == null) {
            this.simuladosUsuario = new ArrayList<SimuladoUsuario>();
        }
        return this.simuladosUsuario;
    }

    public void setSimuladosUsuario(List<SimuladoUsuario> simuladosUsuario) {
        this.simuladosUsuario = simuladosUsuario;
    }
    

    public SimuladoModelo getSimuladoModelo() {
        if (this.simuladoModelo == null) {
            this.simuladoModelo = new SimuladoModelo();
        }
        return this.simuladoModelo;
    }

    public void setSimuladoModelo(SimuladoModelo simuladoModelo) {
        this.simuladoModelo = simuladoModelo;
    }

    public SimuladoModeloMateria getSimuladoMateria() {
        if (this.simuladoMateria == null) {
            this.simuladoMateria = new SimuladoModeloMateria();
        }
        return this.simuladoMateria;
    }

    public void setSimuladoMateria(SimuladoModeloMateria simuladoMateria) {
        this.simuladoMateria = simuladoMateria;
    }

    public List<SimuladoModelo> getSimuladosModelo() {
        if (this.simuladosModelo == null) {
            this.simuladosModelo = new ArrayList<SimuladoModelo>();
        }
        return this.simuladosModelo;
    }

    public void setSimuladosModelo(List<SimuladoModelo> simuladosModelo) {
        this.simuladosModelo = simuladosModelo;
    }

}
